MA

[Resolvido] Bloquear certos pokemons

Por Markowiicz, 09 de out. de 2015 em Resolvidos

resolvido
11
2.6k
MarkowiiczM
10 de outubro de 2015 às 12:43

Alguem poderia me ajudar a bloquear certos pokemons serem catch pela master ball ? Aqui está meu catch.

local texts = {
	[PORTUGUESE] = {"Você CAPTUROU um Pokémon!", "Você está carregando seis pokemons, seu novo pokemon será enviado ao Centro Pokémon de sua cidade natal!", "Não foi dessa vez  Tente novamente!", "A captura de pokémons não é permitida neste local.", "Este objeto não pode ser capturado.", "Você não é o dono deste corpo.", "Por favor, apenas utilize as Saffari Balls dentro da Saffari Zone.", "Este pokémon não pode ser capturado.", "Desculpe, não é possível."},
	[ENGLISH] = {"You CAUGHT a Pokemon!", "You are holding six pokemons, your new pokemon will be sent to the Pokemon Center of your hometown!", "Not this time  Try again!", "Catching pokemons is not allowed inside this place.", "This thing is uncatchable.", "You are not the owner of this corpse.", "Please, only use Saffari Balls inside the Saffari Zone.", "This pokemon is uncatchable.", "Sorry, not possible."},
}
local ballsw = {
[PORTUGUESE] = {"Voce gastou ", "para capturar esse pokemon."},
[ENGLISH] = {"You used ", "to catch it."}
}
local ea = {
[PORTUGUESE] = "e ",
[ENGLISH] = "and ",
}
-- 2001 é abra | 2304 é Wanted Farfetch'd.
-- A cada pokemon novo, adicionar o próximo numero.

local time = 4
local pokeballs = {
	[9271] = {multiplier=1, failEffect=23, successEffect=24, shootEffect=17}, -- STARTER'S PB
	[2149] = {multiplier=1, failEffect=23, successEffect=24, shootEffect=17}, -- PB
	[2147] = {multiplier=2, failEffect=197, successEffect=198, shootEffect=19}, -- GB
	[2150] = {multiplier=3, failEffect=201, successEffect=202, shootEffect=20}, -- SB
	[2146] = {multiplier=4, failEffect=199, successEffect=200, shootEffect=27}, -- UB
	[2151] = {multiplier=1, failEffect=203, successEffect=204, shootEffect=36}, -- Saffari Ball
	[11681] = {multiplier=100000000, failEffect=228, successEffect=228, shootEffect=42}, -- MB
}
catchRate = 1

local function onCapturePokemon(cid, name, params, ballid)
	local txt = texts[getPlayerLanguage(cid)]
	if isCreature(cid) then
		doPlayerAddSoul(cid, 1)
		doPlayerSendTextMessage(cid, 20, txt[1].." ("..name..").")
		if #getPlayerPokeballs(cid) >= 6 then
			local pokeball = doCreatePokeball(name, params.pokeball-1)
			doItemSetAttribute(pokeball, "pokemon_sex", params.sex)
			doPlayerSendMailByName(getCreatureName(cid), pokeball)
			local creature = getPlayerPokemon(cid) == false and cid or getPlayerPokemon(cid)
			doSendMagicEffect(getCreaturePosition(creature), 173)
			local file = io.open('data/logs/catchlog.txt','a')
			file:write(os.date().."  "..getCreatureName(cid).." caught a "..name.." with "..getItemNameById(params.pokeball).." at pos {X="..getCreaturePosition(cid).x.." Y="..getCreaturePosition(cid).y.." Z="..getCreaturePosition(cid).z..".\n")
			file:close()
	        doPlayerSave(cid)
			doPlayerSendTextMessage(cid, 20, txt[2])
			
		else
			local pokeball = doCreatePokeball(name, params.pokeball)
			doItemSetAttribute(pokeball, "pokemon_sex", params.sex)
			doPlayerAddItemEx(cid, pokeball)
		end
	end
end


local function onFailCapturePokemon(cid)
	local txt = texts[getPlayerLanguage(cid)]
	if isCreature(cid) then
		local creature = cid
		local creature = getPlayerPokemon(cid) == false and cid or getPlayerPokemon(cid)
		doSendMagicEffect(getCreaturePosition(creature), 166)
		doPlayerSendTextMessage(cid, 27, txt[3])
	end
end

function onUse(cid, item, frompos, item2, topos)
	local txt = texts[getPlayerLanguage(cid)]
	if isPlayerInsideMewtwoQuest(cid) or isInsideGhostPlagueQuest(cid) then
		doPlayerSendCancel(cid, txt[4])
		return true
	end
	if item2.uid == 0 then
		return false
	end
	
	local corpses = {}
	local it = getTileInfo(topos)
	if not it or it.things == 0 then return false end
	for i=1, it.things do
		local item = getTileThingByPos({x=topos.x, y=topos.y, z=topos.z, stackpos=i})
		if item.uid ~= 0 and isCorpse(item.uid) and getItemAttribute(item.uid, "corpseowner") == cid then
			item2 = item
			break
		end
	end
	
	if item2.uid == 0 or not isCorpse(item2.uid) then
		doPlayerSendCancel(cid, txt[5])
		return true
	end
	
	if getItemAttribute(item2.uid, "corpseowner") ~= cid then
		doPlayerSendCancel(cid, txt[6])
		return true
	end
	            local tableshiny = {"Charizard"}
				if item.uid == 11681 and isInArray(tableshiny, name)then
   doPlayerSendCancel(cid, 27 , "Você não pode catar esse pokemon com a master ball!")
return true
end
			
			
	if getPlayerStorageValue(cid, Saffari.storage) > 0 and item.itemid ~= Saffari.pokeballId then
		doPlayerSendCancel(cid, txt[7])
		return true
	end
	
	for i, x in pairs(pokes) do
		if item2.itemid == x.c then
			local chances = (x.chance) * pokeballs[item.itemid].multiplier * catchRate
			if chances == 0 then
				doPlayerSendCancel(cid, txt[8])
				return TRUE
			end
			
			if math.random(1, 940) <= chances then
				doSendDistanceShoot(frompos, topos, pokeballs[item.itemid].shootEffect)
				doSendMagicEffect(topos, pokeballs[item.itemid].successEffect)
				doAddBrokeCount(cid, item.itemid, i)
				doEndCount(cid, item.itemid, i)
				addEvent(onCapturePokemon, time*1000, cid, i, {pokeball = getPokeballIn(item.itemid), sex = getItemAttribute(item2.uid, "corpsesex") }, item.itemid)
			else
				doSendDistanceShoot(frompos, topos, pokeballs[item.itemid].shootEffect)
				doSendMagicEffect(topos, pokeballs[item.itemid].failEffect)
				addEvent(onFailCapturePokemon, time*1000, cid)
				if getPlayerGroupId(cid) >= 4 and getPlayerGroupId(cid) <= 6 then
				doAddBrokeCount(cid, item.itemid, i)
				end
			end
			
			doRemoveItem(item.uid, 1)
			doRemoveItem(item2.uid, 1)
			
			return TRUE
		end
	end
	
	doPlayerSendCancel(cid, txt[9])
	return TRUE
end
	
function doAddBrokeCount(cid, ballid, pokemon)
local pbb = {9271, 2149}
local gbb = {2147}
local sbb = {2150}
local ubb = {2146, 4758}
local sfbb = {2151}
local sto = pokes[pokemon].sto
local toset = "nb = 0, gb = 0, sb = 0, sfb = 0, ub = 0;"
local toget = "nb = (.-), gb = (.-), sb = (.-), sfb = (.-), ub = (.-);"
if getPlayerStorageValue(cid, sto) == -1 then
setPlayerStorageValue(cid, sto, toset)
end
local b = string.gmatch(getPlayerStorageValue(cid, sto), toget)
local nc = ""
for nb, gb, sb, sfb, ub in (b) do
if isInArray(pbb, ballid) then
nc = "nb = "..(tonumber(nb)+1)..", gb = "..gb..", sb = "..sb..", sfb = "..sfb..", ub = "..ub..";"
break
elseif isInArray(gbb, ballid) then
nc = "nb = "..nb..", gb = "..(tonumber(gb) + 1)..", sb = "..sb..", sfb = "..sfb..", ub = "..ub..";"
break
elseif isInArray(sbb, ballid) then
nc = "nb = "..nb..", gb = "..gb..", sb = "..(tonumber(sb) + 1)..", sfb = "..sfb..", ub = "..ub..";"
break
elseif isInArray(ubb, ballid) then
nc = "nb = "..nb..", gb = "..gb..", sb = "..sb..", sfb = "..sfb..", ub = "..(tonumber(ub) + 1)..";"
break
elseif isInArray(sfbb, ballid) then
nc = "nb = "..nb..", gb = "..gb..", sb = "..sb..", sfb = "..(tonumber(sfb) + 1)..", ub = "..ub..";"
break
end
end
setPlayerStorageValue(cid, sto, nc)
return true
end

function doEndCount(cid, ballid, name)
local sto = pokes[name].sto
	local toget = "nb = (.-), gb = (.-), sb = (.-), sfb = (.-), ub = (.-);"
	local str = ""
	local b = getPlayerStorageValue(cid, sto)
	if b == -1 or b == -2 or not b then doAddBrokeCount(cid, ballid,name) end
local wast = {
nbs = 0,
gbs = 0,
sbs = 0,
ubs = 0,
sfbs = 0,
}
local str = ""
for nb, gb, sb, sfb, ub in (b:gmatch(toget)) do
wast.nbs = (tonumber(nb) > 0 and (tonumber(nb) == 1 and tonumber(nb).." poke ball " or tonumber(nb).." poke balls ")) or ""
wast.gbs = (tonumber(gb) > 0 and (tonumber(nb) == 1 and tonumber(gb).." great ball " or tonumber(gb).." great balls ")) or ""
wast.sbs = (tonumber(sb) > 0 and (tonumber(sb) == 1 and tonumber(sb).." super ball " or tonumber(sb).." super balls ")) or ""
wast.ubs = (tonumber(ub) > 0 and (tonumber(ub) == 1 and tonumber(ub).." ultra ball " or tonumber(ub).." ultra balls ")) or ""
wast.sfbs = (tonumber(sfb) > 0 and (tonumber(sfb) == 1 and tonumber(sfb).." saffari ball " or tonumber(sfb).." saffari balls ")) or ""
local aand = (wast.nbs ~= "" or wast.gbs~="" or wast.sfbs ~="" or wast.sbs~="" or wast.sbs~= "") and wast.ubs ~= ""
local sfbv = (wast.nbs ~= "" or wast.gbs~="") and wast.sfbs ~= ""
local sbv = (wast.nbs ~= "" or wast.gbs~="" or wast.sfbs ~= "") and wast.sbs ~= ""
local gbv = (wast.nbs ~= "") and wast.gbs ~= ""
str = ((wast.nbs)..(gbv and 	wast.gbs~="" and ", " or "")..(wast.gbs)..(sfbv and wast.sfbs~="" and ", " or "")..(wast.sfbs)..(sbv and wast.sbs~="" and ", " or "")..(wast.sbs)..(aand and ea[getPlayerLanguage(cid)] or "")..(wast.ubs))
end
doPlayerSendTextMessage(cid, 20, (ballsw[getPlayerLanguage(cid)][1])..(str)..(ballsw[getPlayerLanguage(cid)][2]))
setPlayerStorageValue(cid, sto, -1)
return true
end

@up

zipter98Z
10 de outubro de 2015 às 12:56

Poderia dar um modelo de nome de corpse? Por exemplo, "fainted charizard" ou "defeated blastoise".

DeadpoolD
10 de outubro de 2015 às 13:05

Zipter, acho que ele não vai encontrar.. Como é basestorm não tem esses atributos, porem achei essa linha em varios arquivos:

if item.uid ~= 0 and isCorpse(item.uid) and item.itemid == corpseId and getItemAttribute(item.uid, "corpseowner") == cid then
corpse = item.uid
break

"corpseowner"

 

zipter98Z
10 de outubro de 2015 às 13:11

Na verdade, basta dar look na corpse que ele verá seu nome (ou também poderá vê-lo em items.xml).

MarkowiiczM
10 de outubro de 2015 às 13:11

@@zipter98

defeated blastoise

Editado Outubro 10 por Lostnick

zipter98Z
10 de outubro de 2015 às 13:24

Mas e o nome do pokémon? Inicia com letra minúscula ou maiúscula?

MarkowiiczM
10 de outubro de 2015 às 13:34

@zipter98 editei acima

zipter98Z
10 de outubro de 2015 às 13:44
Melhor resposta
Troque:


local tableshiny = {"Charizard"}
if item.uid == 11681 and isInArray(tableshiny, name)then
doPlayerSendCancel(cid, 27 , "Você não pode catar esse pokemon com a master ball!")
return true
end

por:


local blocked_pokes = {"charizard"} --Pokémons bloqueados para catch com a master ball. (letra minúscula)

if item.itemid == 11681 and isInArray(blocked_pokes, getItemNameById(item2.itemid):match("defeated (.*)")) then
return doPlayerSendCancel(cid, "You can't catch this pokemon.")
end

MarkowiiczM
10 de outubro de 2015 às 13:51

Obrigado zipter! Pedido sanado

zipter98Z
10 de outubro de 2015 às 13:59

Tópico movido para dúvidas / pedidos resolvidos.

2 anos depois...
FrenviusF
29 de novembro de 2017 às 14:20
A questão neste tópico de suporte foi respondida e/ou o autor do tópico resolveu o problema. Este tópico está fechado e foi movido para Suporte - Resolvidos. Se você tiver outras dúvidas, crie um novo tópico.